package com.service.impl;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.TokenDao;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.Query;

/**
 * Token服务实现类
 *
 * 该类实现了与Token相关的服务，包括生成Token、查询Token信息等。
 * 主要功能包括生成Token、验证Token的有效性以及分页查询Token信息。
 *
 * @author team10
 */
@Service("tokenService")
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {

	/**
	 * 分页查询Token信息
	 *
	 * @param params 查询参数
	 * @return 返回分页查询结果
	 */
	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		// 创建分页对象，并调用selectPage进行分页查询
		Page<TokenEntity> page = this.selectPage(
				new Query<TokenEntity>(params).getPage(),
				new EntityWrapper<TokenEntity>() // 使用EntityWrapper封装查询条件
		);
		// 返回封装后的分页结果
		return new PageUtils(page);
	}

	/**
	 * 根据条件查询Token列表
	 *
	 * @param wrapper 查询条件封装
	 * @return 返回Token列表
	 */
	@Override
	public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
		// 使用baseMapper执行自定义查询
		return baseMapper.selectListView(wrapper);
	}

	/**
	 * 带条件分页查询Token信息
	 *
	 * @param params 查询参数
	 * @param wrapper 查询条件封装
	 * @return 返回分页查询结果
	 */
	@Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<TokenEntity> wrapper) {
		// 创建分页对象并获取数据
		Page<TokenEntity> page = new Query<TokenEntity>(params).getPage();
		// 设置查询结果
		page.setRecords(baseMapper.selectListView(page, wrapper));
		// 返回封装后的分页结果
		PageUtils pageUtil = new PageUtils(page);
		return pageUtil;
	}

	/**
	 * 生成Token
	 *
	 * @param userid 用户ID
	 * @param username 用户名
	 * @param tableName 表名
	 * @param role 用户角色
	 * @return 返回生成的Token
	 */
	@Override
	public String generateToken(Long userid, String username, String tableName, String role) {
		// 查询是否已有该用户的Token
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
		// 生成新的Token
		String token = CommonUtil.getRandomString(32);
		// 设置Token过期时间为当前时间加1小时
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.add(Calendar.HOUR_OF_DAY, 1);
		// 如果已有Token记录，更新Token及过期时间
		if (tokenEntity != null) {
			tokenEntity.setToken(token);
			tokenEntity.setExpiratedtime(cal.getTime());
			this.updateById(tokenEntity);  // 更新Token信息
		} else {
			// 如果没有记录，创建新Token并插入数据库
			this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime()));
		}
		// 返回生成的Token
		return token;
	}

	/**
	 * 根据Token获取Token实体
	 *
	 * @param token 用户Token
	 * @return 返回Token实体，如果Token无效则返回null
	 */
	@Override
	public TokenEntity getTokenEntity(String token) {
		// 根据Token查询Token实体
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
		// 如果Token不存在或已过期，则返回null
		if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) {
			return null;
		}
		// 返回有效的Token实体
		return tokenEntity;
	}
}
